package com.ruoyi.pcj.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.mashuai.utils.base.MsEmptyUtils;
import com.mashuai.utils.toolkit.core.msHandlebean.MsHandleDataUtils;
import com.ruoyi.basis.service.MsBaseServiceImpl;

import java.util.List;

import com.mashuai.utils.toolkit.core.msMp.MsDb;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basis.utils.mp.MpConditionUtils;
import com.ruoyi.basis.utils.mp.MpPageUtils;
import org.apache.commons.collections4.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.Map;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.pcj.domain.PcjChatGroupUser;
import com.ruoyi.pcj.mapper.PcjChatGroupMapper;
import com.ruoyi.pcj.domain.PcjChatGroup;
import com.ruoyi.pcj.service.IPcjChatGroupService;

/**
 * 聊天室-基本信息Service业务层处理
 *
 * @author ms
 * @date 2024-02-29
 */
@Service
public class PcjChatGroupServiceImpl extends MsBaseServiceImpl<PcjChatGroupMapper, PcjChatGroup> implements IPcjChatGroupService {

    @Autowired
    private PcjChatGroupUserServiceImpl pcjChatGroupUserServiceImpl;

    @Override
    public <E extends IPage<PcjChatGroup>> E page(E page, Wrapper<PcjChatGroup> qw) {
        return baseMapper.selectPage(page, qw);
    }

    /**
     * 查询聊天室-基本信息列表
     *
     * @param params 聊天室-查询参数 {"pageNum":1,"pageSize":10}
     * @return 聊天室-基本信息
     */
    @Override
    public IPage<PcjChatGroup> selectPcjChatGroupList(Map<String, Object> params) {
        //获取条件构造器
        QueryWrapper<PcjChatGroup> qw = MpConditionUtils.getQueryWrapper(params, PcjChatGroup.class);
        //分页查询
        Page<PcjChatGroup> page = this.page(MpPageUtils.getPage(params), qw);
        MsHandleDataUtils.handleTbOrDictValBeans(page.getRecords(), PcjChatGroup.class);
        return page;
    }


    /**
     * 根据id查询聊天室-基本信息
     *
     * @param id 聊天室-基本信息主键
     * @return 聊天室-基本信息
     */
    @Override
    public PcjChatGroup selectPcjChatGroupById(String id) {
        //首先获取主表信息
        PcjChatGroup pcjChatGroup = MsDb.getById(id, PcjChatGroup.class);
        //获取表信息
        //getPcjChatGroupUserSubData(pcjChatGroup);
        MsHandleDataUtils.handleTbOrDictValBeans(pcjChatGroup, PcjChatGroup.class);
        return pcjChatGroup;
    }

    /**
     * 回填子表信息
     **/
    private void getPcjChatGroupUserSubData(PcjChatGroup pcjChatGroup) {
        //根据主表id，获取子表信息
        LambdaQueryWrapper<PcjChatGroupUser> sonQw = Wrappers.lambdaQuery();
        sonQw.eq(PcjChatGroupUser::getGroupId, pcjChatGroup.getId());
        List<PcjChatGroupUser> sonList = MsDb.list(sonQw, PcjChatGroupUser.class);
        pcjChatGroup.setPcjChatGroupUserList(sonList);
    }

    /**
     * 新增聊天室-基本信息
     *
     * @param pcjChatGroup 聊天室-基本信息
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean insertPcjChatGroup(PcjChatGroup pcjChatGroup) {
        //保存子表
        savePcjChatGroupUserData(pcjChatGroup);
        //插入主表
        Boolean success = this.insertData(pcjChatGroup);
        return success;
    }

    /**
     * 修改聊天室-基本信息
     *
     * @param pcjChatGroup 聊天室-基本信息
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean updatePcjChatGroup(PcjChatGroup pcjChatGroup) {
        //修改子表
        savePcjChatGroupUserData(pcjChatGroup);
        //修改主表
        Boolean success = this.updateData(pcjChatGroup);
        return success;
    }

    /**
     * 保存子表信息，可新增可更新，根据子表id是否存在判断新增、修改操作
     **/
    public void savePcjChatGroupUserData(PcjChatGroup pcjChatGroup) {
        List<PcjChatGroupUser> pcjChatGroupUserList = pcjChatGroup.getPcjChatGroupUserList();
        if (pcjChatGroupUserList != null && pcjChatGroupUserList.size() > 0) {
            //回填一些默认字段值
            pcjChatGroupUserList.forEach(t -> pcjChatGroupUserServiceImpl.setEntityDefValAuto(t));
            //批量插入
            pcjChatGroupUserServiceImpl.saveOrUpdateBatch(pcjChatGroupUserList);
        }
    }

    /**
     * 批量删除聊天室-基本信息
     *
     * @param ids 需要删除的聊天室-基本信息主键
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean deletePcjChatGroupByIds(String[] ids) {

        //先删除子表---是否需要删除前的一些校验，如果不校验，直接删除所有子表信息
        deletePcjChatGroupUserData(ids);
        //删除主表
        Boolean success = this.removeBatchByIds(Arrays.asList(ids));
        return success;
    }

    /**
     * 根据主表id，删除子表所有数据
     **/
    public void deletePcjChatGroupUserData(String[] ids) {
        LambdaUpdateWrapper<PcjChatGroupUser> sonQw = Wrappers.lambdaUpdate();
        sonQw.set(PcjChatGroupUser::getDelFlag, 1);
        sonQw.in(PcjChatGroupUser::getGroupId, ids);
        MsDb.update(sonQw, PcjChatGroupUser.class);
    }

    @Override
    public List<PcjChatGroup> getChatGroupData(Map<String, Object> params) {
        String groupType = MapUtils.getString(params, "groupType");
        LambdaQueryWrapper<PcjChatGroup> qw = Wrappers.lambdaQuery();
        qw.eq(MsEmptyUtils.isNotEmpty(groupType), PcjChatGroup::getGroupType, groupType);
        qw.orderByDesc(PcjChatGroup::getOnlieNum);
        List<PcjChatGroup> list = baseMapper.selectList(qw);
        return list;
    }

    /**
     * 对外提供的设置默认字段值，id为空新增，不为空更新
     **/
    public void setEntityDefValAuto(PcjChatGroup pcjChatGroup) {
        this.setDefFieldVal(pcjChatGroup);
    }
}
